//
//  main.m
//  protocol
//
//  Created by admin on 2019/8/5.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 protocol
     协议：专门用来定义一大堆方法，（不能声明属性，也不能实现方法，只能用来写方法的声明）
          只要某个类遵守了这个协议，就相当于拥有这个协议中的所有方法声明。
 
1. 协议的声明：
    @protocol 协议的名称<NSObject>
 
    //方法的声明...
 
    @end
 
2. 协议中的对方法的修饰符
    @required
    方法的声明被@required修饰，那么遵守这个协议的类必须要实现这个方法，否则编译器会发出警告。
 
    @optional
    方法的声明被@optional修饰，那么遵守这个协议的类可以实现这个方法，也可以不实现这个方法，编译器也不会报警告
 
3. 协议可以从另外一个协议继承，并且可以多继承
    继承的语法：
    @protocol 协议名称 <父协议名>
 
    @end
 
4. 类的遵守协议
     类只能有一个父类，但可以遵守多个协议
 
     @interface 类名 : 父类名 <协议名1,协议名2,...>
 
     @end
 
5. NSObject - 类的名称和协议的名称一致
    在Foundation框架中，有一个类叫做NSObject，是所有类的基类
    在Foundation框架中，还有一个协议，叫做NSobject
 
    NSObject协议被NSObject类遵守，所以NSObject协议中的所有方法，全部的OC类都拥有
 
6. 协议规范
    要求所有协议都必须直接或者间接的从NSObject基协议继承。
 
7. 协议的类型限制：
    需要调用这个对象中的协议方法，所以才需要添加这个限制
 
    要求声明一个指针，这个指针可以指向任何对象，但是要求指向的对象要遵守指定的协议，否则会报警告。
    语法：
    NSObject<协议名称1,协议名称2,...> *指针名;
    id<协议名称,协议名称2,...> 指针名;  //因为id是typedef类型，在自定义的时候已经有加*，所以声明的时候不用加*
 
    只有类遵守了协议，这个类才能有协议方法。
 
8. 代理设计模式
    代理就是对象中遵守协议的一个属性。
    @property(nonatomic,strong)id<协议名称> 属性名称（代理名称）。
 
 
 */

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
